import { Callout } from "nextra-theme-docs";

# クイックスタート

GZCTF は Docker イメージを通じて提供され、docker-compose を通じて完全に機能する CTF プラットフォームを迅速にデプロイできます。 これが唯一のデプロイ方法ではないことに注意してください。Kubernetes の使用をお勧めします。 関連するデプロイメント方法については、[デプロイメント](/ja/deployment) を参照してください。

<Callout type="warning">

GZCTF のセキュリティとフロントエンド機能 (クリップボードの操作など) は HTTPS に依存しています。このセクションで説明するデプロイ方法は HTTPS サポートを提供していないため、運用環境での使用には適していません、ローカルテストだけのためにで使用してください。

本ドキュメントではHTTPSの設定方法については説明しておりません。nginx、traefik、その他のソフトウェアの設定方法や使用方法についてはご自身でお問い合わせください。GZCTFのWebSocket機能も別途設定が必要な場合がありますのでご了承ください。ゲーム通知をプッシュできない場合は、まずリバース プロキシの設定を確認してください。

</Callout>

## インストレーション

<Callout type="info">

GZCTF の使用をすぐに開始するには、Docker と docker-compose をインストールする必要があります。関連するインストール手順は、[Docker 公式 Web サイト](https://docs.docker.com/engine/install/) まで参照してください。

</Callout>

1. 構成を円滑に進められるために、次の初期化パラメータを準備してください。

   - `GZCTF_ADMIN_PASSWORD`：初期管理者パスワード。 データベースが初期化されていない状態で有効となり、初回起動時に設定する必要があり、`compose.yml` で設定する必要があります。
   - `POSTGRES_PASSWORD`: データベースのパスワード。`compose.yml` と `appsettings.json` で設定する必要があります。
   - `XOR_KEY`: ゲーム秘密鍵の暗号化に使用されるランダムな文字列。`appsettings.json` で設定する必要があります。
   - `PUBLIC_ENTRY`: 外部アクセス アドレス。IP アドレスまたはドメイン名であり、プロジェクト コンテナにアクセスするためのアドレスを参加者に提供するために使用されます。`appsettings.json` で設定する必要があります。

2. 次のコンテンツを `appsettings.json` ファイルとして保存し、**初期化パラメーターに置き換えってください**。具体的な構成手順については、[`appsettings.json` 構成](/ja/config/appsettings) を参照してください。

   ```json
   {
     "AllowedHosts": "*",
     "ConnectionStrings": {
       "Database": "Host=db:5432;Database=gzctf;Username=postgres;Password=<Your POSTGRES_PASSWORD>"
     },
     "EmailConfig": {
       "SenderAddress": "",
       "SenderName": "",
       "UserName": "",
       "Password": "",
       "Smtp": {
         "Host": "localhost",
         "Port": 587
       }
     },
     "XorKey": "<Your XOR_KEY>",
     "ContainerProvider": {
       "Type": "Docker", // or "Kubernetes"
       "PortMappingType": "Default", // or "PlatformProxy"
       "EnableTrafficCapture": false,
       "PublicEntry": "<Your PUBLIC_ENTRY>", // or "xxx.xxx.xxx.xxx"
       // optional
       "DockerConfig": {
         "SwarmMode": false,
         "Uri": "unix:///var/run/docker.sock"
       }
     },
     "RequestLogging": false,
     "DisableRateLimit": true,
     "RegistryConfig": {
       "UserName": "",
       "Password": "",
       "ServerAddress": ""
     },
     "CaptchaConfig": {
       "Provider": "None", // or "CloudflareTurnstile" or "GoogleRecaptcha"
       "SiteKey": "<Your SITE_KEY>",
       "SecretKey": "<Your SECRET_KEY>",
       // optional
       "GoogleRecaptcha": {
         "VerifyAPIAddress": "https://www.recaptcha.net/recaptcha/api/siteverify",
         "RecaptchaThreshold": "0.5"
       }
     },
     "ForwardedOptions": {
       "ForwardedHeaders": 5,
       "ForwardLimit": 1,
       "TrustedNetworks": ["192.168.12.0/8"]
     }
   }
   ```

3. 次のコンテンツを `compose.yml` ファイルとして保存し、**初期化パラメーターに置き換えってください**。

   ```yaml
   services:
     gzctf:
       image: gztime/gzctf:latest
       restart: always
       environment:
         - "GZCTF_ADMIN_PASSWORD=<Your GZCTF_ADMIN_PASSWORD>"
         # choose your backend language `en_US` / `zh_CN` / `ja_JP`
         - "LC_ALL=ja_JP.UTF-8"
       ports:
         - "80:8080"
       volumes:
         - "./data/files:/app/files"
         - "./appsettings.json:/app/appsettings.json:ro"
         # - "./kube-config.yaml:/app/kube-config.yaml:ro" # this is required for k8s deployment
         - "/var/run/docker.sock:/var/run/docker.sock" # this is required for docker deployment
       depends_on:
         - db

     db:
       image: postgres:alpine
       restart: always
       environment:
         - "POSTGRES_PASSWORD=<Your POSTGRES_PASSWORD>"
       volumes:
         - "./data/db:/var/lib/postgresql/data"
   ```

   <Callout type="info">

   ネットワーク セグメントの競合が発生する可能性があります。その場合は `compose.yml` のサブネット構成
   または `/etc/docker/daemon.json` のネットワーク セグメント構成を変更してください。

   ```yaml
   networks:
     default:
       driver: bridge
       ipam:
         config:
           - subnet: 192.168.12.0/24
   ```

   </Callout>

4. `docker compose up -d` を実行して GZCTF を起動して、ブラウザから GZCTF にアクセスできるようになります。

## 初期管理者

生産環境にはデフォルトで管理者権限を持つユーザーが存在しないため、初回起動時に環境変数 `GZCTF_ADMIN_PASSWORD` を設定して初期管理者パスワードを設定し、`Admin` アカウントでログインする必要があります。

データベースエントリを手動で変更することで、現在登録されているユーザーを管理者として設定することもできます。管理者アカウントが登録を完了し、正常にログインしたら、選択したデータベース テーブルに入り、次を実行します。

```sql
UPDATE "AspNetUsers" SET "Role"=3 WHERE "UserName"='your_admin_user_name';
```

次のコマンドが使用される場合もあります：

```bash
docker compose exec db psql -U postgres
```

```bash
psql (15.2)
Type "help" for help.

postgres=# \c gzctf
You are now connected to database "gzctf" as user "postgres".
gzctf=# #do your sql query
```

## Redisをキャッシュとして使用する

Redis をキャッシュとして使用して、よりシームレスなバージョンの切り替えとサーバーの再起動エクスペリエンスを実現する場合は、上記の構成に次のコンテンツを追加してください：

1. ファイル `compose.yml` に

   ```yaml
   services:
     gzctf:
       # ...
       depends_on:
         - db
         - cache

     cache:
       image: redis:alpine
       restart: always

     db:
       # ...
   ```

2. ファイル `appsettings.json` に

   ```json
   {
     "AllowedHosts": "*",
     "ConnectionStrings": {
       // ...
       "RedisCache": "cache:6379,abortConnect=false"
     }
     // ...
   }
   ```

そして、`docker compose up -d` を実行して GZCTF をリスタートすればよいです。

## コンテナイメージ

GZCTF は、Docker イメージとして事前に構築およびパッケージ化されており、[Docker Hub](https://hub.docker.com/r/gztime/gzctf) で見つけることができます。

イメージを取得するには、次の 2 つのコンテナー レジストリを使用してください。

```
gztime/gzctf:latest
ghcr.io/gztimewalker/gzctf/gzctf:latest
```

テスト版と開発版には `develop` イメージタグを使用してください。

## チャレンジ構成

チャレンジの構成と例については、[GZCTF-Challenges](https://github.com/GZTimeWalker/GZCTF-Challenges) をご覧ください。

また、[W4terCTF 2023](https://github.com/W4terDr0p/W4terCTF-2023) の公開チャレンジを参照することもできます。ここでのチャレンジはすべて、Docker イメージのサイズが確実に小さくなるように設計されています。チャレンジが正常に機能している場合は十分ですが、ゲーム中に迅速にデプロイするには十分です。

GZCTF は、`GZCTF_FLAG` 環境変数をコンテナに挿入することで動的なフラッグ配布が実装されています。そのため、この環境変数のテキストがチャレンジの**コンテナ初期化スクリプト**内の適切な場所に配置されていることを確認してください。 この環境変数は、コンテナー イメージのビルド時ではなく、コンテナーの起動時に初期化されることに注意してください。
